package com.example.demo.ProxyClass;

import java.util.Date;

/**
 * @author jw
 * 静态代理
 * HelloServiceProxy类是代理类，HelloServiceImpl类是委托类，这两个类都实现了HelloService接口。
 * 其中HelloServiceImpl类是HelloService接口的真正实现者，而HelloServiceProxy类是通过调用HelloServiceImpl类的相关方法来提供特定服务的。
 * HelloServiceProxy类的echo()方法和getTime()方法会分别调用被代理的HelloServiceImpl对象的echo()方法和getTime()方法，并且在方法调用前后都会执行一些简单的打印操作。
 * 由此可见，代理类可以为委托类预处理消息、把消息转发给委托类和事后处理消息等
 * HelloServiceProxy类的源代码是由程序员编写的，在程序运行前，它的.class文件就已经存在了，这种代理类称为静态代理类
 */
public class ProxyHolleService implements HolleService{
    //表示被代理的HelloService 实例
    private HolleService helloService;

    public ProxyHolleService(HolleService holleService){
        this.helloService = holleService;
    }

    public void setHolleServiceProxy(HolleService helloService) {
        this.helloService = helloService;
    }

    @Override
    public String echo(String string) {
        //预处理
        System.out.println("before calling echo()");
        //调用被代理的HelloService 实例的echo()方法
        String result= helloService.echo(string);
        //事后处理
        System.out.println("after calling echo()");
        return result;

    }

    @Override
    public Date getDate() {
        //预处理
        System.out.println("before calling getTime()");
        //调用被代理的HelloService 实例的getTime()方法
        Date date=helloService.getDate();
        //事后处理
        System.out.println("after calling getTime()");
        return date;
    }

    //main测试
    public static void main(String arg[]){
        HolleService holleService = new HolleServiceImp();
        ProxyHolleService proxyHolleService = new ProxyHolleService(holleService);
        proxyHolleService.echo("test");
        proxyHolleService.getDate();
    }
}
